package com.hxd.mall.base

import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Intent
import android.content.pm.ActivityInfo
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.ImageView
import androidx.annotation.LayoutRes
import com.hxd.mall.R
import com.hxd.mall.constant.HxdConstants.IntentParamsKeyDefine.search_Key
import com.hxd.mall.constant.HxdConstantsRouterPath.Search.path_product_search
import com.hxd.mall.constant.HxdGlobalInfo.isReStart
import com.hxd.mall.module.product.search.SearchActivity
import com.hxd.mall.module.startup.WelcomeActivity
import com.hxd.mall.utils.local.NavigationUtil.routerNavigation
import com.hxd.mall.utils.local.PrimaryUtil
import com.hxd.mall.utils.local.StackManageUtil
import com.hxd.mall.utils.local.getPrimary
import com.hxd.mall.utils.local.setPrimaryClip
import com.hxd.mall.utils.open.AnimationUtil
import com.hxd.mall.utils.open.ApkTool.isForeground
import com.hxd.mall.utils.open.LancherAppUtils
import com.hxd.mall.utils.open.showConfirmWithTitleNewBgDialog
import com.hxd.mall.widget.HxdTitleBarView
import com.hxd.threelibrary.getUmClient
import com.trello.rxlifecycle2.LifecycleTransformer
import crossoverone.statuslib.StatusUtil
import javax.inject.Inject


/**
 * 基类Activity
 */
abstract class
BaseInjectActivity<T : IBasePresenter> : DaggerAppCompatActivity(),
    IBaseView {

    private var alertDialog: Dialog? = null

    /**
     * 把 Presenter 提取到基类需要配合基类的 initInjector() 进行注入，如果继承这个基类则必定要提供一个 Presenter 注入方法，
     * 该APP所有 Presenter 都是在 Module 提供注入实现，也可以选择提供另外不带 Presenter 的基类
     */
    @Inject
    @JvmField
    var mPresenter: T? = null

    /**
     * 绑定布局文件
     *
     * @return 布局文件ID
     */
    @LayoutRes
    protected abstract fun attachLayoutRes(): Int

    /**
     * 初始化视图控件
     */
    protected abstract fun initViews()

    /**
     * 初始化数据
     */
    protected abstract fun initData()

    /**
     * 是否存在fragment
     */
    override fun isContainFragment() = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //动态多次修改权限回来后界面被销毁，因此要重启一次
        if (savedInstanceState != null && isReStart) {
            finish()
            LancherAppUtils.openCLD(this.packageName, this)
            StackManageUtil.closeAll()
            return
        }
        //防止点击home 键在回来后应用重启
        if (!this.isTaskRoot && intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intent.action == Intent.ACTION_MAIN) {
            finish()
            return
        }
        //竖屏
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        setContentView(attachLayoutRes())
        StackManageUtil.add(this)

        initViews()
        initData()

        setStatusBar()
    }

    /**
     * 设置状态栏是否是沉浸式和颜色
     */
    private fun setStatusBar() {
        setStatusColor()
        setSystemInvadeBlack()
    }

    open fun setStatusColor() {
        StatusUtil.setUseStatusBarColor(this, Color.TRANSPARENT)
    }

    open fun setSystemInvadeBlack() {
        // 第二个参数是是否沉浸,第三个参数是状态栏字体是否为黑色。
        StatusUtil.setSystemStatus(this, true, true)
    }

    open fun toSearch(searchText: String) {}

    override fun onStart() {
        super.onStart()

        //判断应用是否可见(不论启动还是吊起),
        if (!isForeground(this))
            return

        //启动页不需要弹
        if (this::class.java == WelcomeActivity::class.java)
            return

        /**
         * 判断粘贴搬的内容是否符合条件，如果符合则直接跳转到搜索界面
         *
         * getBooleanData表示同样的内容是否显示过，如果显示过则不显示，没有显示过则显示弹窗
         */
        val primary = getPrimary(this)
        if (primary.isNotEmpty() && 8 <= primary.length && primary.length <= 200 && !PrimaryUtil.getBooleanData(primary)) {
            PrimaryUtil.clearAllData()
            //修改显示的状态
            PrimaryUtil.saveBooleanData(primary, true)
            showConfirmWithTitleNewBgDialog(primary, "立即搜索") {
                if (it) {
                    //如果当前是搜索界面，则直接执行搜索方法
                    if (this::class.java == SearchActivity::class.java) {
                        toSearch(primary)
                    } else
                        routerNavigation(path_product_search, search_Key, primary)

                }
                PrimaryUtil.saveBooleanData(primary, false)
                setPrimaryClip(this, "")
            }
        }
    }

    override fun onResume() {
        super.onResume()
        if (!isContainFragment()) {
            getUmClient().onPageStart(this.javaClass.simpleName)
        }
        getUmClient().onResume(this)
    }

    @SuppressLint("NewApi")
    override fun onPause() {
        super.onPause()
        if (!isContainFragment()) {
            getUmClient().onPageEnd(this.javaClass.simpleName)
        }
        getUmClient().onPause(this)
    }

    override fun onDestroy() {
        super.onDestroy()
        if (alertDialog != null && alertDialog?.isShowing!!) {
            alertDialog?.dismiss()
        }
        StackManageUtil.removeActivityItem(this)
    }

    override fun <T> bindToLife(): LifecycleTransformer<T> = this.bindToLifecycle()

    override fun showLoading() {
        if (alertDialog != null && alertDialog?.isShowing!!) {
            return
        }
        initLoadingDialog()
        alertDialog?.show()
    }

    override fun hideLoading() {
        if (alertDialog != null && alertDialog?.isShowing!!) alertDialog?.dismiss()
    }

    override fun finishRefresh() {}

    override fun netSuccess(vararg t: Any) {}

    /*override fun attachBaseContext(newBase: Context) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase))
    }*/

    private fun initLoadingDialog() {
        alertDialog = Dialog(this, R.style.TranslucentBackground)
        val inflater = LayoutInflater.from(this).inflate(R.layout.dialog_loading, null).apply {
            findViewById<ImageView>(R.id.iv_dialogloading_img).startAnimation(AnimationUtil.strRotation())
        }

        alertDialog?.setContentView(inflater)
        alertDialog?.setCanceledOnTouchOutside(false)
        alertDialog?.setCancelable(false)
    }

    /**
     * 公共title设置，只有返回键
     */
    fun setTitleCommon(titleName: String = ""): HxdTitleBarView {
        return HxdTitleBarView(this).setTitleName(titleName).setTitleLeftJustImg().setOnLeftClickedListenerCommon()
    }

    fun setTitleCommon(titleName: String = "", callback: () -> Unit): HxdTitleBarView {
        return HxdTitleBarView(this).setTitleName(titleName).setTitleLeftJustImg().setOnLeftClickedListener(callback)
    }


}
